package com.media.thread;

import com.media.cache.CacheUtil;
import com.media.config.MediaCaptorLiveConfig;
import com.media.pojo.CameraPojo;
import com.media.utils.DateUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Date;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 定时任务 (定时轮询 , 关闭直播流)
 **/
@Component
@Slf4j
public class TimerUtil implements CommandLineRunner {

    /**
     * 配置文件bean
     */
    @Resource
    private MediaCaptorLiveConfig config;

    public static Timer timer;

    @Override
    public void run(String... args) {
//      超过5分钟，结束推流
        timer = new Timer("timeTimer");
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
//                1 : 判断 管理缓存
                if (null != CacheUtil.STREAM_MAP && 0 != CacheUtil.STREAM_MAP.size()) {
//                2 : 获取到所有的 key , 已经开始推的流
                    Set<String> keys = CacheUtil.STREAM_MAP.keySet();
//                3 : 循环key
                    for (String key : keys) {
                        CameraPojo cameraPojo = CacheUtil.STREAM_MAP.get(key);
                        try {
//                          3.1 : 最后打开时间
                            long openTime = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, cameraPojo.getOpenTime()).getTime();
//                          3.2 : 当前系统时间
                            long newTime = new Date().getTime();
//                          3.3 : 如果通道使用人数为0，则关闭推流
                            if (cameraPojo.getCount() == 0) {
                                // 3.3.1 : 结束线程
                                CacheUtil.JOB_MAP.get(key).setInterrupted();
                                // 3.3.2 : 清除缓存
                                CacheUtil.STREAM_MAP.remove(key);
                                CacheUtil.JOB_MAP.remove(key);
                                log.info("[定时任务](使用人数为0)  关闭 {} 摄像头...", key);
//                          3.4 : 判断当前流 , 是否指定时间内 , 没人保活,则退出
                            } else if ((newTime - openTime) / 1000 / 60 > Integer.parseInt(config.getKeepalive())) {
                                CacheUtil.JOB_MAP.get(key).setInterrupted();
                                CacheUtil.JOB_MAP.remove(key);
                                CacheUtil.STREAM_MAP.remove(key);
                                log.info("[定时任务](超过了保活时间)  关闭 {} 摄像头...", key);
                            }
                        } catch (Exception e) {
                            log.error("[定时任务](出现异常)  关闭 {} 摄像头 出现异常 : ", key, e);
                        }
                    }
                }
            }
        }, 1, 1000 * 60);
    }
}
